package vista;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Point;
import java.awt.geom.Point2D;
import java.awt.image.BufferedImage;
import java.util.Observable;
import java.util.Observer;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;

import vista.paneles.EastPanel;
import vista.paneles.MapPanel;
import vista.paneles.NorthPanel;

import modelo.LocalMessage;
import modelo.Model.Individuals;
import modelo.info.MapPoint;

import controlador.Controlador;

public class PrincipalGUI extends JFrame implements Observer {

	//private MapImagePanel mapa;
	private MapPanel mapa;
	private JLabel newMap; 
	private NorthPanel panelSuperior;
	private EastPanel panelDerecha;
	private Controlador controlador;
	//private KeyboardFocusManager manager;
	//private KeyDispacher keyDispacher;
	
	public PrincipalGUI(Controlador control,String nombre) {
		
		super(nombre);
		setLayout(new BorderLayout());
		controlador = control;
		newMap = new JLabel();
		mapa = new MapPanel(); // just a JPanel extension, add to any swing/awt container
		mapa.setZoom(16); // set some zoom level (1-18 are valid)
		double lon = -3.7322858;
		double lat = 40.4494742;
		Point position = mapa.computePosition(new Point2D.Double(lon,lat));
		mapa.setCenterPosition(position);
		mapa.repaint();
		mapa.getOverlayPanel().setVisible(false);
		
		panelSuperior = new NorthPanel(controlador,mapa);
		panelDerecha = new EastPanel(controlador);
		add(BorderLayout.NORTH,panelSuperior);	
		add(BorderLayout.EAST,panelDerecha);
		add(BorderLayout.CENTER,mapa);
	    controlador.getModelo().addObserver(this);
	    controlador.setMapa(mapa);
	    setResizable(false);
	    setSize(1000,700);
		setVisible(true);
		setLocationRelativeTo(null);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
	}

	public void update(Observable o, Object arg) {
	
		LocalMessage mensaje = (LocalMessage)arg;
		Point posicion = null;
		Integer eleccion = null;
		switch(mensaje.getId()) {
			case 1: // Cambia el panel por la imagen al simular
				BufferedImage imagen = (BufferedImage)mensaje.getContenido();
				remove(mapa);
				ImageIcon icon = new ImageIcon(imagen);
				newMap = new JLabel(icon);
				add(BorderLayout.CENTER,newMap);
				break;
			case 2: //Cambia la imagen por el panel al finalizar
				remove(newMap);
				add(BorderLayout.CENTER,mapa);
				break;
			case 3:
				panelSuperior.getPanelSimulacion().setEntornoConfigurado(true);
				break;
			case 4:
				Integer value = (Integer)mensaje.getContenido();
				panelDerecha.getSpeed().setValue(value.intValue());
				break;
			case 5:
				posicion = (Point)mensaje.getContenido();
				eleccion = JOptionPane.showConfirmDialog(getParent(),"Confirme que desea incluir este grupo de individuos ya excluidos.","Problema en la configuracion",JOptionPane.YES_NO_OPTION,JOptionPane.INFORMATION_MESSAGE);
				if (eleccion == JOptionPane.YES_OPTION) {
					controlador.eliminarTipo(posicion.x);
					JOptionPane.showMessageDialog(getParent(),"Los individuos con las caracteristicas indicadas han sido incluidos.","Problema en la configuracion",JOptionPane.INFORMATION_MESSAGE);
				}
				else {
					controlador.eliminarTipo(posicion.y);
					controlador.getModelo().setClave(controlador.getModelo().getClave()-1);
					JOptionPane.showMessageDialog(getParent(),"Los individuos con las caracteristicas indicadas permanecen excluidos.","Problema en la configuracion",JOptionPane.INFORMATION_MESSAGE);
				}
				break;
			case 6:
				JOptionPane.showMessageDialog(this,"El tipo de individuos introducido ya ha sido excluido.","Problema en la configuracion",JOptionPane.INFORMATION_MESSAGE);
				break;
			case 7:
				posicion = (Point)mensaje.getContenido();
				eleccion = JOptionPane.showConfirmDialog(getParent(),"Confirme que desea excluir este grupo de individuos ya incluidos.","Problema en la configuracion",JOptionPane.YES_NO_OPTION,JOptionPane.INFORMATION_MESSAGE);
				if (eleccion == JOptionPane.YES_OPTION) {
					controlador.eliminarTipo(posicion.x);
					JOptionPane.showMessageDialog(getParent(),"Los individuos con las caracteristicas indicadas han sido excluidos.","Problema en la configuracion",JOptionPane.INFORMATION_MESSAGE);
				}
				else {
					controlador.eliminarTipo(posicion.y);
					controlador.getModelo().setClave(controlador.getModelo().getClave()-1);
					JOptionPane.showMessageDialog(getParent(),"Los individuos con las caracteristicas indicadas permanecen incluidos.","Problema en la configuracion",JOptionPane.INFORMATION_MESSAGE);
				}
				break;
			case 9:
				panelSuperior.getPanelSimulacion().setConfig(false);
				break;
			case 10:
				JOptionPane.showMessageDialog(getParent(),"No se pudo realizar la modificacion" +
						" debido a que ya hay un perfil del mismo tipo creado.","Problema al modificar",
						JOptionPane.INFORMATION_MESSAGE);
				break;
			case 11:
				MapPoint[][] m = (MapPoint[][])mensaje.getContenido();
				actualizarMapa(m);
				break;
		}
	}
	
	public void actualizarMapa(MapPoint[][] mapa) {
		
		BufferedImage original = controlador.getModelo().getAlmacen().getMapaImage();
		BufferedImage copia = new BufferedImage(original.getWidth(),original.getHeight(),BufferedImage.TYPE_INT_RGB);
		for(int i=0;i<original.getWidth();i++)
			for (int j=0;j<original.getHeight();j++)
					copia.setRGB(i,j,original.getRGB(i,j));
		for(int i=0;i<original.getWidth();i++)
			for (int j=0;j<original.getHeight();j++)
				if (mapa[i][j].getOcupante().equals(Individuals.Vehiculo.ordinal())) {
					Point punto = new Point(i,j);
					for (int k=punto.x-1;k<=punto.x+1;k++)
						for (int l=punto.y-1;l<=punto.y+1;l++)
							if (controlador.getModelo().dentroMapa(k,l))
								copia.setRGB(k,l,Color.magenta.getRGB());
				}	
		ImageIcon icon = new ImageIcon(copia);
		//remove(newMap);
		newMap.setIcon(icon);
		//add(BorderLayout.CENTER,newMap);
		repaint();
		
	}
}
